package com.atguigu.mybatis;

import com.atguigu.mybatis.mapper.UserMapper;
import com.atguigu.mybatis.pojo.User;
import com.atguigu.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author 林允
 * @version 1.0
 * @description: TODO
 * @date 2023/4/15 15:06
 */

/**
 * 总结 1. 先获取核心配置文件
 *      2. 得到会话sqlSession 通过(构建器 SqlSessionFactoryBuilder -> 工厂类 SqlSessionFactory -> 会话 SqlSession )
 *      3. sqlSession.getMapper(UserMapper.class) 通过核心配置文件找到UserMapper.xml 然后生成一个实现了Mapper接口方法的实例类
 *      4.实例类通过调用方法 对 数据库 进行增删改查 提交事务 关闭会话
 */
public class test {
    @Test
    public void testInsert() throws IOException {
        // 获取核心配置文件的输入流
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 获取SqlSessionFactoryBuilder对象  构建器
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 获取SqlSessionFactory 对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        // 获取sql的会话对象 SqlSession(不会自动提交事务), 是mybatis提供的操作数据库的对象
        //SqlSession sqlSession = sqlSessionFactory.openSession();

        // 会自动提交事务的
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        // 获取UserMapper的代理实现 代理模式 创建mapper了接口的代理实现类 不用自己再创建一个类
        // 通过UserMapper 类名再UserMapper.xml 文件中找到自己的命名空间
        // 再通过特有的方法名 在UserMapper.xml 中 重写方法
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 调用mapper接口中的方法, 实现添加用户信息的功能
        int result = mapper.insertUser();
        // 没有Mapper接口的情况，最原始的情况
        // 通过sql语句的唯一表示找到sql并执行， 唯一标识namespace.sqlId
        //int result = sqlSession.insert("com.atguigu.mybatis.mapper.UserMapper.insertUser");
        System.out.println("结果:" + result);
        // 以SqlSession 方式进行不会自动提交事务
        // 提交事务
        //sqlSession.commit();
        // 关闭会话 关闭数据库连接
        sqlSession.close();
    }

    @Test
    public void testUpdate(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int i = mapper.updateUser();
        sqlSession.close();
        System.out.println(i);
    }

    @Test
    public void testDelete(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        // 调用该方法会 生产一个实例对象 通过核心配置文件和UserMapper配置文件 并重写实现了UserMapper中的方法
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.deleteUser();
        sqlSession.close();
    }

    @Test
    public void testGetUserById(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById();
        System.out.println(user);
    }

    @Test
    public void testGetAllUser(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> list = mapper.getAllUser();
        list.forEach(System.out::println);
    }

}
